package com.zhuang.taiqiu.netty.handler;

import com.zhuang.taiqiu.config.GCmd;
import com.zhuang.taiqiu.proto.GameMessageOuterClass.GameMessage;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@ChannelHandler.Sharable
public class WebSocketProtobufHandler extends SimpleChannelInboundHandler<GameMessage> {

    private final Logger LOGGER = LoggerFactory.getLogger(getClass());

    @Autowired
    private LoginHandler loginHandler;

    @Autowired
    private CueHandler cueHandler;

    @Autowired
    private RoomHandler roomHandler;

    @Autowired
    private HitBallHandler hitBallHandler;

    @Override
    public void channelRead0(ChannelHandlerContext ctx, GameMessage msg) throws Exception {
        /**此处要添加验证token有用性**/
        if (msg.getCommand().equalsIgnoreCase(GCmd.C2S.USER_LOGIN.getDescription())) {
            LOGGER.info("登录账号");
            loginHandler.doLogin(ctx, msg);/**跟前端对接**/

        }else if (msg.getCommand().equalsIgnoreCase(GCmd.C2S.INITIATE_CUE_SYNC.getDescription())) {
            LOGGER.info("球杆移动同步");
            cueHandler.moveSync(ctx, msg);//逻辑
            /**客户端操作一次，就会向服务器发送一条信息*/
        }else if (msg.getCommand().equalsIgnoreCase(GCmd.C2S.HIT_BALL.getDescription())) {
            LOGGER.info("打球，同步球的位置");
            /**当客户端收到的时候，开始击球
             * 当收到玩家发来的击球信息，白球和其他球的位置，迅速群发给全部人
             * 直接做转发就行（其实还有很多校验，是否当前玩家发球等的，但是目前前只要做到能群发就行）*/
            hitBallHandler.handleHitBallEvent(ctx, msg);
        }else if (msg.getCommand().equalsIgnoreCase(GCmd.C2S.HIT_BALL_COMPLETE.getDescription())) {
            LOGGER.info("打球完成，同步球的位置");
            /**当客户端收到的时候，停止击球，把球的位置都记录下来，迅速群发给所有人，这里返回谁才是接任当前回合
             * 其实回合结束，要计算得分，进球就得分，但目前这个先不做*/

            hitBallHandler.handleHitBallCompleteEvent(ctx, msg);
        }else if (msg.getCommand().equalsIgnoreCase(GCmd.C2S.MATCH_PLAYER.getDescription())) {
            LOGGER.info("快速匹配玩家");
            roomHandler.mataRoom(ctx, msg);
        }else if (msg.getCommand().equalsIgnoreCase(GCmd.C2S.MATCH_PLAYER_CANCEL.getDescription())) {
            LOGGER.info("取消匹配玩家");
            roomHandler.cancelMataRoom(ctx, msg);
        }else{
            LOGGER.error("当前不是合法的处理器");
        }
        /**击球的时候会同步一次，同步完毕也会同步一次**/
        /**当断线重连，第一次进入房间，需要同步球杆力度和角度，还有所有球的位置信息，房间所有信息*/
        /**此处还可以再加一个旁观者的处理器(处理进入或者离开)**/
    }

    // ... 其他channelActive和channelInactive方法 ...


    // 假设我们从HTTP请求头或WebSocket连接时传递的参数中获取用户ID
    private String generateUserId(String ipPort) {
        // 在WebSocket握手阶段（例如：HTTP请求升级为WebSocket连接时），可以从HTTP请求的Header、Cookie或其他有效身份凭证中提取用户ID
        // 这是一个模拟实现，实际中应替换为你的认证和用户ID获取机制
        return "userId" + ipPort; // 临时返回一个固定值，实际应替换为实际用户ID
    }

    /**
     * 封装一个方法用于向客户端发送Protobuf消息
     */
    public void sendMessageToClient(ChannelHandlerContext ctx, GameMessage message) {
        // 使用BinaryWebSocketFrame发送二进制数据
        ByteBuf encodedMessage = Unpooled.wrappedBuffer(message.toByteArray());
        ctx.writeAndFlush(new BinaryWebSocketFrame(encodedMessage));
    }


}